/**
 * 卡片扩展模块，提供卡片创建、销毁、刷新等生命周期回调
 *
 * 卡片生命周期管理文件
 */
import formInfo from '@ohos.app.form.formInfo';
import formBindingData from '@ohos.app.form.formBindingData';
import FormExtensionAbility from '@ohos.app.form.FormExtensionAbility';
import formProvider from '@ohos.app.form.formProvider';

import ZoraHttp from '@zora/http';
import hilog from '@ohos.hilog';

import storage from '@ohos.data.storage'


const TAG: string = "EntryFormAbility--"
const TAG_LIKAI: string = "likai-test"

export default class EntryFormAbility extends FormExtensionAbility {
  private formDataArray = [
    {
      title: "微信卡片",
      message: "我现在可以接受微信消息展示啦，随时关注消息提醒，不会错过任何信息哦"
    },
    {
      title: "支付宝卡片",
      message: "我现在可以接受支付宝消息展示啦，随时关注消息提醒，不会错过任何信息哦"
    },
    {
      title: "短信卡片",
      message: "我现在可以接受短信消息展示啦，随时关注消息提醒，不会错过任何信息哦"
    },
    {
      title: "小红书卡片",
      message: "我现在可以接受小红书消息展示啦，随时关注消息提醒，不会错过任何信息哦"
    },
    {
      title: "百度地图卡片",
      message: "我现在可以接受百度地图消息展示啦，随时关注消息提醒，不会错过任何信息哦"
    }
  ]
  /**
   * 使用方 创建卡片 时触发
   * 返回一个FormBindingData对象
   */
  onAddForm(want) {
    console.log(TAG_LIKAI, "创建卡片--onAddForm")
    console.log(TAG_LIKAI, "formInfo:" + JSON.stringify(formInfo))
    console.log(TAG_LIKAI, "want.parameters:" + JSON.stringify(want.parameters))
    // 在入参want中可以取出卡片的唯一标识：formId
    let formId: string = want.parameters[formInfo.FormParam.IDENTITY_KEY];
    // 初始化卡片数据
    // 是否为临时表单
    let isTempCard: boolean = want.parameters[formInfo.FormParam.TEMPORARY_KEY];

    // 如果未常态卡片（非临时卡片），直接进行信息持久化
    if (isTempCard === false) {
      console.log(TAG_LIKAI, `当前非临时卡片， init db for formId:${formId}`);

      // 持久化卡片数据

      let storeDb = storage.getStorageSync(this.context.filesDir + 'myStore');
      storeDb.putSync(`A${formId}`, 'false');
      storeDb.flushSync();
    }

    // 使用方创建卡片时触发，提供方需要返回卡片数据绑定类
    let formData = {
      "formId": formId,
      "title": "初次赋值",
      "message": "初次message"
    };
    return formBindingData.createFormBindingData(formData);
  }

  /**
   * 使用方将临时卡片转换为常态卡片触发，提供方需要做相应的处理
   * 当通知表单提供程序临时表单已成功转换为普通表单时调用
   */
  onCastToNormalForm(formId) {
    console.log(TAG_LIKAI, "适用房将临时卡片转换为常态卡片--onCastToNormalForm")
    // 使用方将临时卡片转换为常态卡片触发，提供方需要做相应的处理
    console.info(TAG, `[EntryFormAbility] onCastToNormalForm, formId: ${formId}`);
  }

  /**
   * 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能，则提供方需要重写该方法以支持数据更新
   *
   * 调用以通知表单提供程序更新指定的表单
   */
  onUpdateForm(formId) {
    console.log(TAG_LIKAI, "卡片支持定时更新/定点更新/卡片使用方主动请求更新时调用--onUpdateForm")
    // 若卡片支持定时更新/定点更新/卡片使用方主动请求更新功能，则提供方需要重写该方法以支持数据更新
    console.info(TAG, '[EntryFormAbility] onUpdateForm - formId:' + formId);

    // 获取天气接口：https://api.oioweb.cn/api/weather/GetWeather

    ZoraHttp.get("https://api.oioweb.cn/api/weather/GetWeather")
      .bind(this)
      .setDesc("测试一下Get请求")
      .send({
        beforeSend: (request) => {

          return true;
        },
        onResponse: (request, response, customResult) => {
          hilog.info(0x1000, TAG_LIKAI, `%{public}s`, JSON.stringify(response))

        },
        onError: (request, err) => {

        },
        afterSend: (request) => {

        }
      })

    // 获取当前格式化时间
    let timeFormat = getCurrentFormatTime()

    let obj = {
      'title': '刷新后的卡片标题',
      'message': '刷新后卡片内容，时间：' + timeFormat
    };
    let formData = formBindingData.createFormBindingData(obj);
    formProvider.updateForm(formId, formData).catch((err) => {
      if (err) {
        // 异常分支打印
        console.error(`[EntryFormAbility] Failed to updateForm. Code: ${err.code}, message: ${err.message}`);
        return;
      }
    });
  }
  /**
   * 需要配置formVisibleNotify为true，且为系统应用才会回调
   *
   * 当表单提供程序从系统接收表单事件时调用。
   */
  onChangeFormVisibility(newStatus) {
    console.log(TAG_LIKAI, "当表单提供程序从系统接收表单事件时调用--onChangeFormVisibility")
    // 需要配置formVisibleNotify为true，且为系统应用才会回调
    console.info(TAG, '[EntryFormAbility] onChangeFormVisibility');
  }
  /**
   * 若卡片支持触发事件，则需要重写该方法并实现对事件的触发
   *
   * 当触发表单提供程序定义的指定消息事件时调用
   *
   * 处理 postCardAction() 的 message 消息
   */
  onFormEvent(formId, message) {
    console.log(TAG_LIKAI, "当触发表单提供程序定义的指定消息事件时调用,message消息--onFormEvent")
    // 若卡片支持触发事件，则需要重写该方法并实现对事件的触发
    console.info(TAG, '[EntryFormAbility] onFormEvent');
    console.info(TAG, `FormAbility onEvent, formId = ${formId}, message: ${JSON.stringify(message)}`);

    // 解析message
    let msgData = JSON.parse(message)
    if (msgData.eventName === "textMessageEvent") {
      // 处理卡片刷新
      // 请求接口，获取天气数据
      ZoraHttp.get("https://api.oioweb.cn/api/weather/GetWeather")
        .bind(this)
        .setDesc("测试一下Get请求")
        .send({
          beforeSend: (request) => {
            return false;
          },
          onResponse: (request, response, customResult) => {
            hilog.info(0x1000, TAG_LIKAI, `%{public}s`, JSON.stringify(response))

          },
          onError: (request, err) => {

          },
          afterSend: (request) => {

          }
        })

      let dataIndex = Math.round(Math.random() * 4)
      let formData = this.formDataArray[dataIndex]
      // 获取当前格式化时间
      let timeFormat = getCurrentFormatTime()
      formData.message += "时间：" + timeFormat
      formData["formId"] = formId
      let formInfo = formBindingData.createFormBindingData(formData)
      formProvider.updateForm(formId, formInfo).then((data) => {
        console.info(TAG, 'FormAbility updateForm success.' + JSON.stringify(data));
      }).catch((error) => {
        console.error(TAG, 'FormAbility updateForm failed: ' + JSON.stringify(error));
      })
    } else {
      console.error(TAG, "没有指定的message eventName")
    }
  }
  /**
   * 当对应的卡片删除时触发的回调，入参是被删除的卡片ID
   *
   * 调用以通知表单提供程序指定的表单已被销毁
   *
   * 临时卡片 或 常驻卡片 的删除
   */
  onRemoveForm(formId) {
    console.log(TAG_LIKAI, `卡片删除,fromId:${formId}`)
    // 当对应的卡片删除时触发的回调，入参是被删除的卡片ID
    console.info(TAG, '[EntryFormAbility] onRemoveForm,formId:' + formId);
  }
  /**
   * 当系统配置信息置更新时触发的回调
   */
  onConfigurationUpdate(config) {
    console.log(TAG_LIKAI, "系统配置信息置更新--onConfigurationUpdate:" + JSON.stringify(config))
    // 当系统配置信息置更新时触发的回调
    console.info(TAG, '[EntryFormAbility] configurationUpdate:' + JSON.stringify(config));
  }
  /**
   * 卡片提供方接收查询卡片状态通知接口，默认返回卡片初始状态。
   */
  onAcquireFormState(want) {
    console.log(TAG_LIKAI, "卡片提供方接收查询卡片状态通知接口--onAcquireFormState")
    // 卡片提供方接收查询卡片状态通知接口，默认返回卡片初始状态。
    return formInfo.FormState.READY;
  }
};


/**
 * 获取当前时间的格式化时间
 */
function getCurrentFormatTime() {
  let date = new Date()
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const format = '{y}-{m}-{d} {h}:{i}:{s}'
  let timeFormat = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return timeFormat
}